package com.grailslm

import org.apache.shiro.SecurityUtils
import org.apache.shiro.authc.IncorrectCredentialsException
import org.apache.shiro.authc.LockedAccountException
import org.apache.shiro.authc.UnknownAccountException
import org.apache.shiro.authc.UsernamePasswordToken
import org.apache.shiro.config.IniSecurityManagerFactory
import org.apache.shiro.session.Session
import org.apache.shiro.subject.Subject
import javax.naming.AuthenticationException

class Example
{
    static void main(def args) {
        SecurityUtils.setSecurityManager(new IniSecurityManagerFactory("classpath:shiro.ini").getInstance()) //SecurityManager，房东。默认Realm（shiro.ini），有效身份权限信息库
        Subject visitor = SecurityUtils.getSubject()// 当前与应用程序交互的东西，访客。Session session = visitor.getSession();（org.apache.shiro.session）

        if (!visitor.isAuthenticated()) { //验证当前访客是否已通过认证
            UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456") //访客提供身份信息，把用户名和密码封装成UsernamePasswordToken
            token.setRememberMe(true)
            try {
                visitor.login(token) //想要入住，验证访客身份信息的合法性。如果登录失败，你可以通过所抛异常，来了解究竟发生了什么
            } catch (UnknownAccountException uae) {
                println "用户名不存在：" + token.getPrincipal()
            } catch (IncorrectCredentialsException ice) {
                println "密码错误"
            } catch (LockedAccountException lae) {
                println "账号被锁定：" + token.getPrincipal()
            }
        }

        if(visitor.getPrincipal()) { //获取访客身份信息合法性验证结果
            println("${visitor.getPrincipal()}：登录成功") //合法，安排入住

            def role = "管理员" //角色名称
            if (visitor.hasRole(role)) { //是否拥有某个角色
                println("${role}：是")
            } else {
                println("${role}：否")
            }

            def operation = "video:1080P" //操作名称
            if (visitor.isPermitted(operation)) { //是否有权进行某种操作
                println("${operation}：允许")
            } else {
                println("${operation}：拒绝")
            }

            visitor.logout() //退房
        } else {
            println("登录失败") //不合法，拒绝入住
        }

        System.exit(0)
    }
}
